package com.buaa.divinationmaster.test.utils;

import android.content.Context;

import androidx.room.Room;

import com.buaa.divinationmaster.core.algorithm.AlgorithmConfig;
import com.buaa.divinationmaster.core.database.DivinationDatabase;
import com.buaa.divinationmaster.core.utils.RandomProvider;

import org.mockito.Mockito;

import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.Mockito.when;

/**
 * 统一的Mock对象提供器
 * 为测试环境提供一致的Mock依赖注入
 */
public class MockProviders {

    /**
     * 创建Mock的RandomProvider，使用固定种子确保测试结果可重现
     */
    public static RandomProvider createMockRandomProvider(long seed) {
        RandomProvider mockProvider = Mockito.mock(RandomProvider.class);
        
        // 模拟随机数生成，使用固定种子确保可重现性
        java.util.Random seededRandom = new java.util.Random(seed);
        
        // Mock nextInt方法
        when(mockProvider.nextInt(anyInt())).thenAnswer(invocation -> {
            int bound = invocation.getArgument(0);
            return seededRandom.nextInt(bound);
        });
        
        // Mock nextLong方法 - 确保每次调用都返回可预测的值
        when(mockProvider.nextLong()).thenAnswer(invocation -> seededRandom.nextLong());
        
        // Mock nextDouble方法
        when(mockProvider.nextDouble()).thenAnswer(invocation -> seededRandom.nextDouble());
        
        // Mock setSeed方法 - 重新设置内部随机数生成器的种子
        Mockito.doAnswer(invocation -> {
            long newSeed = invocation.getArgument(0);
            seededRandom.setSeed(newSeed);
            return null;
        }).when(mockProvider).setSeed(anyLong());
        
        return mockProvider;
    }

    /**
     * 创建Mock的AlgorithmConfig，提供测试用的配置参数
     */
    public static AlgorithmConfig createMockAlgorithmConfig() {
        AlgorithmConfig mockConfig = Mockito.mock(AlgorithmConfig.class);
        
        // 设置默认的测试配置，使用实际的方法名
        when(mockConfig.getMaxCacheSize()).thenReturn(100);
        when(mockConfig.getTarotShuffleIterations()).thenReturn(7);
        when(mockConfig.isSecureRandomEnabled()).thenReturn(true);
        when(mockConfig.isCacheEnabled()).thenReturn(true);
        when(mockConfig.isDebugMode()).thenReturn(false);
        when(mockConfig.getLogLevel()).thenReturn("INFO");
        
        return mockConfig;
    }

    /**
     * 创建Mock的DivinationDatabase，用于测试环境
     * 注意：这个方法主要用于特殊测试场景，大部分情况应该使用真实的内存数据库
     */
    public static DivinationDatabase createMockDatabase(Context context) {
        // 对于大部分测试，建议使用真实的内存数据库而不是Mock
        return Room.inMemoryDatabaseBuilder(context, DivinationDatabase.class)
                .allowMainThreadQueries()
                .build();
    }
}
